home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programmer Power Tools
/
Programmer Power Tools.iso
/
rbbs_pc
/
173_asm.arc
/
ANSI17.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-11-27
|
8KB
|
162 lines
; ANSI1-7ASM Revised 11/28/88 Garry G. Kraemer
;
; A problem existed with version 1-6 when the sysop exited to DOS from
; CHAT and returned, Linefeeds would not be displayed on the CRT.
; The text would overwrite on the same line. After several hours of
; intense debugging, I have placed a few lines of code into the .ASM
; file that will add a LineFeed (LF or CHR$(10)) to STRNG$ if it
; does not end with one. I assume that if I find a CR and am NOT at
; the end of the string, a LF follows!!
;
; Changed lines reflect GGK in the right column
;
; Garry G. Kraemer 520 El Portal Merced, CA
; WINTONS LOCAL RBBS 9758 N SHAFFER RD WINTON, CA 95388
; 2400/1200/300 24hrs 400 days a year (209) 358-6154
;
; ANSI1-6ASM Revised 10/28/87 Jon Martin fix boundary bug
; ANSI1-5ASM Revised 8/24/85 Dave Terry for QuickBasic Compiler
; ANSI1-4ASM Revised 8/23/85 Dave Staehlin
ANSI_PRNT SEGMENT PUBLIC 'CODE' ;By David W. Terry
ASSUME CS:ANSI_PRNT ; 3036 So. Putnam Ct.
PUBLIC ANSI ; West Valley City, UT 84120
; Screen scroll mods by David C. Staehlin
; 5430 Candle Glow NE
; Albuquerque, NM 87111
;
; Data (505) 821-7379 24 Hrs, 2400 Baud
STRG_LEN DW 0 ;CHANGED TO LENGTH OF STRING PASSED
VID_PAGE DB 0 ;Active video page
;
;
ANSI PROC FAR
PUSH BP
MOV BP,SP
;
MOV SI,10[BP] ;GET STRING DESCRIPTOR
MOV BL,[SI+ 2] ;REARRANGE LOW/HIGH BYTES
MOV BH,[SI+ 3] ;NOW BX HOLDS THE ADDRESS OF THE STRING
MOV AX,[SI] ;GET STRING LENGTH
ADD AX,BX ;ADD INITIAL OFFSET (BX) TO LENGTH
MOV STRG_LEN,AX ;STORE OFFSET PLUS LENGTH
;
PUSH BX ;SAVE BX
MOV AH,15 ;Get current video state
INT 10H ;DO INTERRUPT
MOV VID_PAGE,BH ;Save it
POP BX ;RESTORE BX
;
MOV AH,02 ;SET UP FOR FUNCTION CALL 02H
LOOP:
MOV DL,[BX] ;SET DL TO CHARACTER TO PRINT
PUSH DX ;Save the character in AX 'till we check..
CALL WHERE_ARE_WE ; where the cursor is.......
CMP DH,17H ;Row 24?
JL NOPE ; Jump if less......
CMP DX,174FH ;Row 24 column 79 ?
JZ NEXT1 ;YES, JUMP TO NEXT 1
CMP DH,18H ;Row 25?
JZ NOPE ;Don't scroll line 25
; DEC BX ; Else backup one character
; JMP SCROLL2 ; And go scroll the screen
;
; program never executes thru NEXT2!! Trust ME! GGK
;
NEXT2: POP DX ;And restore the stack to where it was
CMP DL,0AH ;Do we have a line feed?
JZ SCROLL ; Yup - scroll this sucker!
CMP DL,0DH ; How about a carriage return?
JNZ NOPE1 ; Nope - just go display it.......
INC BX ; Yup - see if next char is a line feed
MOV DX,[BX]
CMP DL,0AH ; Well, is it?
JZ SCROLL ; It sure is - let's go scroll
DEC BX ; Oops - just a carriage return
JMP SCROLL ; But let's go scroll it anyway
;
NEXT1: POP DX ; save DX
INT 21H ; print char using interrupt
CALL SCROLLIT
JMP EXIT1
;
NOPE: POP DX
NOPE1: INT 21H ;Else just display it
SKIPIT: INC BX ; point to next char
CMP DL,0DH ; WAS LAST CHAR A CR? GGK
JNZ NOTCR ; NO, jump to not CR GGK
CMP BX, STRG_LEN ; AT END OF STRING? GGK
JB LOOP ; NO, CONTINUE - NEXT MUST BE A LF!! GGK
MOV DL,0AH ; ELSE AT END OF STRING SO WE ADD A LF! GGK
INT 21H ; DO INTERRUPT AND DISPLAY IT! GGK
JMP EXIT1 ; AND EXIT GGK
; GGK
; GGK
NOTCR: CMP BX,STRG_LEN ; Test 'AT END OF STRING' ? GGK
JB LOOP ; NO, LOOP UNTIL ALL CHARS PROCESSED
;
EXIT1: MOV AH,03 ;SET UP FOR ROM-BIOS CALL (03H)
MOV BH,VID_PAGE ;TO READ THE CURRENT CURSOR POSITION
INT 10H ; DH = ROW DL = COLUMN
INC DH ;ADD 1 TO ROW (BECAUSE TOP OF SCREEN = 0)
INC DL ;ADD 1 TO COL (BECAUSE POS 1 = 0)
;
MOV SI,[BP]+ 8
MOV [SI],DH ;PASS BACK ROW COORDINATE
MOV SI,[BP]+ 6
MOV [SI],DL ;PASS BACK COLUMN COORDINATE
;
POP BP
RET 6
ANSI ENDP
Where_Are_We: ;Get the current cursor position
PUSH AX ;Save the registers
PUSH BX
PUSH CX
MOV AH,03 ;SET UP FOR ROM-BIOS CALL (03H)
MOV BH,VID_PAGE ;TO READ THE CURRENT CURSOR POSITION
INT 10H ; DH = ROW DL = COLUMN
POP CX ;Restore the registers
POP BX
POP AX
RET ;And go back from wence we came
;
SCROLL2: POP DX ;Put the stack like it was
SCROLL: CALL SCROLLIT ;Scroll the screen
JMP SKIPIT
;
SCROLLIT: PUSH AX ;Save the registers that will be affected
PUSH BX
PUSH CX
PUSH DX
PUSH BP
MOV AH,2 ;Now set cursor position to 24,0
MOV DX,1700H ;so we can get the proper character
MOV BH,VID_PAGE ;attribute
INT 10H
MOV AH,8 ;Get the current character attribute
MOV BH,VID_PAGE
INT 10H
MOV BH,AH ;Transfer the attribute to BH for next call
MOV AH,6 ;Otherwise scroll 24 lines
MOV AL,1 ; Only blank line 24
MOV CX,0000H ; Begin scroll at position 0,0
MOV DX,174FH ; End scroll at Line 24, Col 79
INT 10H ; And do it.......
MOV AH,2 ;Now set cursor position to 24,0
MOV DX,1700H
MOV BH,VID_PAGE
INT 10H
POP BP
POP DX ;Restore the stack like it was
POP CX
POP BX
POP AX
RET
;
ANSI_PRNT ENDS
END